package com.kk.crowd.mvc.handler;

import com.kk.crowd.service.api.MenuService;
import com.kk.crowd.entity.Menu;
import com.kk.crowd.util.ResultEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.List;

@Controller
public class MenuHandler {

    @Autowired
    private MenuService menuService;

    @ResponseBody
    @RequestMapping("menu/remove.json")
    public ResultEntity<String> removeMenu(@RequestParam("id") Integer id) {
        menuService.removeMenu (id);
        return ResultEntity.successWithoutData ( );
    }

    @ResponseBody
    @RequestMapping("menu/edit.json")
    public ResultEntity<String> editMenu(Menu menu) {
        menuService.editMenu (menu);
        return ResultEntity.successWithoutData ( );
    }

    @ResponseBody
    @RequestMapping("menu/save.json")
    public ResultEntity<String> saveMenu(Menu menu) {

        menuService.saveMenu (menu);
        return ResultEntity.successWithoutData ( );
    }

    @ResponseBody
    @RequestMapping("menu/get/whole/tree.json")
    public ResultEntity<Menu> getWholeTreeNew() {

        // 1、查询全部的Menu对象
        List<Menu> menuList = menuService.getAll ( );

        // 2、声明一个变量用来存储找到的根节点
        Menu root = null;

        // 3.创建 Map 对象用来存储 id 和 Menu 对象的对应关系便于查找父节点
        HashMap<Integer, Menu> menuMap = new HashMap<> ( );

        // 4、遍历menuList 填充 menuMap
        for (Menu menu : menuList) {
            Integer id = menu.getId ( );
            menuMap.put (id, menu);
        }
        // 5、再次遍历menuList,查找根节点，组装父子节点
        for (Menu menu : menuList) {
            // 6.获取当前 menu对象的 pid属性值
            Integer pid = menu.getPid ( );
            // 7.检查pid是否为null
            if (pid == null) {
                // 8.把当前正在遍历的这个menu对象赋值给root
                root = menu;
                // 9.停止本次循环，继续执行下一次循环
                continue;
            }
            // 9.如果pid不为null，说明当前节点有父节点，找到父节点就可以进行组装，建立父子关系
            Menu father = menuMap.get (pid);

            // 10.将当前节点存入父节点的 children 集合中
            father.getChildren ( ).add (menu);
        }
        // 11.经过上面的运算，根节点root 已经包含了整个树形结构，返回节点就是整个树
        return ResultEntity.successWithoutData (root);
    }
}
